int ( *OrigStudioDrawPlayer )( int flags, struct entity_state_s *pplayer );

void VectorTransform (float *in1, float in2[3][4], float *out)
{
    out[0] = DotProduct(in1, in2[0]) + in2[0][3];
    out[1] = DotProduct(in1, in2[1]) + in2[1][3];
    out[2] = DotProduct(in1, in2[2]) + in2[2][3];
}
void GetHeadPosition(cl_entity_t *pEnt)
{
   typedef float BoneMatrix_t[MAXSTUDIOBONES][3][4];
   
   model_t *pModel;
   studiohdr_t *pStudioHeader;
   BoneMatrix_t *pBoneMatrix;
   Vector vBBMin = Vector(0, 0, 0);
   Vector vBBMax = Vector(0, 0, 0);
   mstudiobbox_t *pHitbox;

int i;

local_player_info playerdata[32];

   if(!vPlayers[pEnt->index].bGotHead)
   {
       pModel = IEngineStudio.SetupPlayerModel(pEnt->index);
       pStudioHeader = (studiohdr_t*)IEngineStudio.Mod_Extradata(pModel);
       pBoneMatrix = (BoneMatrix_t*)IEngineStudio.StudioGetBoneTransform();
    pHitbox = (mstudiobbox_t*)((byte*)pStudioHeader + pStudioHeader->hitboxindex);

 int iGroup = cvar.hitbox;
 

 if (cvar.hitbox > 20) {cvar.hitbox = 11;}

 i = cvar.hitbox;
   if(i)
  {
    Vector vCubePoints[8];
    Vector vCubePointsTrans[8];
   Vector testvec;
   Vector vNew;
   Vector vOffset;

   VectorTransform(pHitbox[i].bbmin, (*pBoneMatrix)[pHitbox[i].bone], vBBMin);
    VectorTransform(pHitbox[i].bbmax, (*pBoneMatrix)[pHitbox[i].bone], vBBMax);

    if(i)
   {
    vPlayers[pEnt->index].vPlayerHead = (vBBMax + vBBMin)*0.5f;
    vPlayers[pEnt->index].vPlayerHead[0] = vPlayers[pEnt->index].vPlayerHead[0] + cvar.hbox_x;
                   vPlayers[pEnt->index].vPlayerHead[1] = vPlayers[pEnt->index].vPlayerHead[1] + cvar.hbox_y;
                   vPlayers[pEnt->index].vPlayerHead[2] = vPlayers[pEnt->index].vPlayerHead[2] + cvar.hbox_z;

    vPlayers[pEnt->index].bGotHead = true;
   {
     if(gAimbot.target !=-1)
{
 if (vPlayers[gAimbot.target].getEnt()->curstate.gaitsequence == 6 && cvar.hitboxaim)
 {
    vPlayers[pEnt->index].vPlayerHead = (vBBMax + vBBMin)*0.5f;
    vPlayers[pEnt->index].vPlayerHead[0] = vPlayers[pEnt->index].vPlayerHead[0] + cvar.jump_x;
                   vPlayers[pEnt->index].vPlayerHead[1] = vPlayers[pEnt->index].vPlayerHead[1] + cvar.jump_y;
                   vPlayers[pEnt->index].vPlayerHead[2] = vPlayers[pEnt->index].vPlayerHead[2] + cvar.jump_z;

    vPlayers[pEnt->index].bGotHead = true;
 }
}
     vPlayers[pEnt->index].vAimOffset = vPlayers[pEnt->index].vPlayerHead - vPlayers[pEnt->index].getEnt()->origin;
     Vector vLog = (vPlayers[pEnt->index].vPlayerHead - pEnt->origin);
   
    }
   }


   vCubePoints[0] = (pHitbox[i].bbmin);
   vCubePoints[1] = Vector(pHitbox[i].bbmin.x, pHitbox[i].bbmax.y, pHitbox[i].bbmin.z);
   vCubePoints[2] = Vector(pHitbox[i].bbmax.x, pHitbox[i].bbmax.y, pHitbox[i].bbmin.z);
   vCubePoints[3] = Vector(pHitbox[i].bbmax.x, pHitbox[i].bbmin.y, pHitbox[i].bbmin.z);

   vCubePoints[4] = (pHitbox[i].bbmax);
   vCubePoints[5] = Vector(pHitbox[i].bbmin.x, pHitbox[i].bbmax.y, pHitbox[i].bbmax.z);
   vCubePoints[6] = Vector(pHitbox[i].bbmin.x, pHitbox[i].bbmin.y, pHitbox[i].bbmax.z);
   vCubePoints[7] = Vector(pHitbox[i].bbmax.x, pHitbox[i].bbmin.y, pHitbox[i].bbmax.z);

   

   int iColor = pHitbox[i].group;

   

   if (cvar.drawhitbox)
   {
    for(int j = 0; j < 8; j++)
    {
     VectorTransform(vCubePoints[j], (*pBoneMatrix)[pHitbox[i].bone], vCubePointsTrans[j]);
    }


     glDisable(GL_TEXTURE_2D);
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   
            glColor4f(cvar.hitbox_r,cvar.hitbox_g,cvar.hitbox_b,cvar.hitbox_a);
            glLineWidth(cvar.hitbox_w);
            glBegin(GL_LINE_LOOP);
            glVertex3fv(vCubePointsTrans[0]);
            glVertex3fv(vCubePointsTrans[1]);
            glVertex3fv(vCubePointsTrans[2]);
            glVertex3fv(vCubePointsTrans[3]);
            glEnd();
            glBegin(GL_LINE_LOOP);
            glVertex3fv(vCubePointsTrans[4]);
            glVertex3fv(vCubePointsTrans[5]);
            glVertex3fv(vCubePointsTrans[6]);
            glVertex3fv(vCubePointsTrans[7]);
            glEnd();
            glBegin(GL_LINES);
            glVertex3fv(vCubePointsTrans[0]);
            glVertex3fv(vCubePointsTrans[6]);
            glVertex3fv(vCubePointsTrans[1]);
            glVertex3fv(vCubePointsTrans[5]);
            glVertex3fv(vCubePointsTrans[2]);
            glVertex3fv(vCubePointsTrans[4]);
            glVertex3fv(vCubePointsTrans[3]);
            glVertex3fv(vCubePointsTrans[7]);
            glEnd();

            glDisable(GL_BLEND);
            glEnable(GL_TEXTURE_2D);
   }
  }
}
}


int NewStudioDrawPlayer ( int flags, struct entity_state_s *pplayer )
{
    cl_entity_t *pEnt;
   int ret = OrigStudioDrawPlayer ( flags, pplayer );
      
   pEnt = IEngineStudio.GetCurrentEntity();
   
   if(isvalident(pEnt))
   
   if(pEnt && pEnt->player)
   {
      GetHeadPosition(pEnt);
   }
   return ret;
} 
//==================================================================================
void func_hitboxad() 
{ 
if(cvar.hitboxaim) { 
cvar.hbox_x = cmd.argF(1); 
cvar.hbox_y = cmd.argF(2); 
cvar.hbox_z = cmd.argF(3);
} 
}
void func_jumpad() 
{ 
if(cvar.hitboxaim) { 
cvar.jump_x = cmd.argF(1); 
cvar.jump_y = cmd.argF(2); 
cvar.jump_z = cmd.argF(3);
} 
} 
void func_hitboxclear(void) 
{ 
cvar.hbox_z = 0; 
cvar.hbox_y = 0; 
cvar.hbox_x = 0; 
} 
void func_jumpclear(void) 
{ 
cvar.jump_z = 0; 
cvar.jump_y = 0; 
cvar.jump_x = 0; 
} 
void func_hitboxlist(void) 
{ 
Con_Echo("Hitbox : %f %f %f", cvar.hbox_x, cvar.hbox_y, cvar.hbox_z); 
} 
void func_jumplist(void) 
{ 
Con_Echo("Hitbox-Jump : %f %f %f", cvar.jump_x, cvar.jump_y, cvar.jump_z); 
} 